macos: Explicitly ungrab seat when drag is done or finalized
authorArjan Molenaar <gaphor@gmail.com>
Sat, 3 Dec 2022 23:05:39 +0000 (00:05 +0100)
committerArjan Molenaar <gaphor@gmail.com>
Tue, 13 Dec 2022 14:19:04 +0000 (15:19 +0100)
This is an extra safeguard that avoids grabbing resources longer than
nessecary. It also ensures the resource is removed from the drag,
so it is not freed again.

gdk/macos/gdkmacosdrag.c

index b7d97267989572b825f8eb0c95d75f6bdd31df4e..34e8be98740ad25a5b5c5ec1886ffa89e2b7e931 100644 (file)
@@ -218,6 +218,12 @@ drag_ungrab (GdkMacosDrag *self)
 
   g_assert (GDK_IS_MACOS_DRAG (self));
 
+  if (self->drag_seat)
+    {
+      gdk_seat_ungrab (self->drag_seat);
+      g_clear_object(&self->drag_seat);
+    }
+
   display = gdk_drag_get_display (GDK_DRAG (self));
   _gdk_macos_display_break_all_grabs (GDK_MACOS_DISPLAY (display), GDK_CURRENT_TIME);
 }
@@ -536,7 +542,11 @@ gdk_macos_drag_finalize (GObject *object)
   GdkMacosDragSurface *drag_surface = g_steal_pointer (&self->drag_surface);
 
   g_clear_object (&self->cursor);
-  g_clear_object (&self->drag_seat);
+  if (self->drag_seat)
+    {
+      gdk_seat_ungrab (self->drag_seat);
+      g_clear_object (&self->drag_seat);
+    }
 
   G_OBJECT_CLASS (gdk_macos_drag_parent_class)->finalize (object);